package cn.saas.jingtandata;

import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;

import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map.Entry;

/**
 * 文件浏览
 *
 * @author A18ccms a18ccms_gmail_com
 * @ClassName: FileBrowseActivity
 * @Description: TODO(这里用一句话描述这个类的作用)
 * @date 2016年1月15日 下午4:24:37
 */
public class FileBrowseActivity extends AppCompatActivity implements
        OnClickListener, OnItemClickListener {
    /**
     * 返回文件列表
     */
    public static final String INTENT_RESULT_FILE = "FILE_LIST";
    /**
     * 文件类型
     */
    public static final String INTENT_PARAM_FILE_TYPE = "FILE_TYPE";
    /**
     * 文件夹类型
     */
    public static final int FILTER_TYPE_FLODER = 1;
    /**
     * 无过滤
     */
    public static final int FILTER_TYPE_NON = 0;
    /**
     * 文件类型过滤
     */
    public static final int FILTER_TYPE_FILE = 2;
    /**
     * 文件后缀
     */
    public static final String INTENT_PARAM_FILTER_SUFFIX = "FILE_SUFFIX";
    // //////////////////////////////////
    /**
     * 空信息
     */
    private LinearLayout mEmptyLayout;
    /**
     * 文件列表
     */
    private ListView mFileList;
    // ///////////////////////////////////
    /**
     * 文件适配器
     */
    private FileBrowseItemAdapter mFileAdapter;
    /**
     * SD卡 列表
     */
    private List<FileInfoBean> mSdcardList;
    /**
     * 文件数据
     */
    private List<FileInfoBean> mFileDataList;
    /**
     * 父级路径
     */
    private String mParentPath;
    /**
     * 后缀类型过滤
     */
    private String mFileSuffix;
    /**
     * 文件类型过滤
     */
    private int mFileFilter = FILTER_TYPE_NON;

    @Override
    protected void onCreate(Bundle bundle) {
        super.onCreate(bundle);
        setContentView(R.layout.activity_tool_file_browse);
        initIntent();
        initView();
        initData();
    }


    /**
     * 初始化传入数据
     *
     * @Title: initIntent
     * @Description: TODO(这里用一句话描述这个方法的作用)
     */
    private void initIntent() {
        Intent intent = getIntent();
        if (intent != null) {
            mFileFilter = intent.getIntExtra(INTENT_PARAM_FILE_TYPE,
                    FILTER_TYPE_NON);
            mFileSuffix = intent.getStringExtra(INTENT_PARAM_FILTER_SUFFIX);
        }
    }

    /**
     * 初始化数据
     *
     * @Title: initView
     * @Description: TODO(这里用一句话描述这个方法的作用)
     */
    private void initView() {
        mEmptyLayout = (LinearLayout) findViewById(R.id.empty_layout);
        mFileList = (ListView) findViewById(R.id.file_list);
        mFileList.setOnItemClickListener(this);
        mFileAdapter = new FileBrowseItemAdapter(this,
                R.layout.adapter_file_browse_item, null);
        mFileList.setAdapter(mFileAdapter);
        findViewById(R.id.control_btn).setOnClickListener(this);
        if (mFileFilter == FILTER_TYPE_FILE) {
            setTitle("选择文件");
            findViewById(R.id.control_btn).setVisibility(View.GONE);
        } else {
            setTitle("选择文件夹");
            findViewById(R.id.control_btn).setVisibility(View.VISIBLE);
        }
        // 按钮--返回
        LayoutInflater layoutInflater = (LayoutInflater) this
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        View backview = layoutInflater.inflate(R.layout.view_bar_back, null);
        backview.findViewById(R.id.back_btn).setOnClickListener(this);
//		this.mTitleLeftLayout.addView(backview);
    }

    /**
     * 初始化数据
     *
     * @Title: initData
     * @Description: TODO(这里用一句话描述这个方法的作用)
     */
    private void initData() {
        if (TextUtils.isEmpty(mParentPath)) {
            mSdcardList = initSdcardList();
            if (mSdcardList != null && mSdcardList.size() > 0) {
                if (mSdcardList.size() == 1) {
                    mFileDataList = getFiles(mSdcardList.get(0).getFilePath(),
                            false);
                } else {
                    mFileDataList = mSdcardList;
                }
                if (mFileDataList != null && mFileDataList.size() > 0) {
                    mFileAdapter.setData(mFileDataList);
                    showContent();
                } else {
                    showEmpty();
                }
            } else {
                showEmpty();
            }
        } else {
            getFiles(mParentPath, false);
        }

    }

    /**
     * 初始化SD卡信息
     *
     * @return
     * @Title: getSdcard
     * @Description: TODO(这里用一句话描述这个方法的作用)
     */
    private List<FileInfoBean> initSdcardList() {
        List<FileInfoBean> rel = new ArrayList<FileInfoBean>();
        HashMap<String, SDCardInfo> sdList = SDCardInfo.getSDCardInfo(this);
        Iterator<Entry<String, SDCardInfo>> iter = sdList.entrySet().iterator();
        while (iter.hasNext()) {
            Entry<String, SDCardInfo> entry = iter.next();
            SDCardInfo sdcard = entry.getValue();
            File file = new File(sdcard.getPath());
            if (file.exists() && file.isDirectory()) {
                rel.add(new FileInfoBean(file.getName(), file.getPath(),
                        FusionUnitType.FileType.SDCARD));
            }
        }
        return rel;
    }

    /**
     * 读取文件数据
     *
     * @Title: initFile
     * @Description: TODO(这里用一句话描述这个方法的作用)
     */
    private List<FileInfoBean> getFiles(String filePath, boolean isPre) {
        List<FileInfoBean> rel = new ArrayList<FileInfoBean>();
        if (!TextUtils.isEmpty(filePath)) {
            File file = new File(filePath);
            // 文件是否存在
            if (file.exists()) {
                // 读取上一层文件
                if (isPre) {
                    File par = file.getParentFile();
                    if (par != null && par.isDirectory()) {
                        File[] files = par.listFiles();
                        if (files != null && files.length > 0) {
                            for (File sub : files) {
                                switch (mFileFilter) {
                                    case FILTER_TYPE_FILE:
                                        // 后缀过滤为空，则全部加在
                                        if (TextUtils.isEmpty(mFileSuffix)) {
                                            rel.add(new FileInfoBean(
                                                    sub.getName(),
                                                    sub.getPath(),
                                                    sub.isDirectory() ? FusionUnitType.FileType.FLODER
                                                            : FusionUnitType.FileType.FILE));
                                        } else {
                                            // 过滤后缀
                                            if (sub.getName()
                                                    .toUpperCase()
                                                    .endsWith(
                                                            mFileSuffix
                                                                    .toUpperCase())) {
                                                rel.add(new FileInfoBean(
                                                        sub.getName(),
                                                        sub.getPath(),
                                                        sub.isDirectory() ? FusionUnitType.FileType.FLODER
                                                                : FusionUnitType.FileType.FILE));
                                            }
                                        }
                                    case FILTER_TYPE_FLODER:
                                        if (sub.isDirectory()) {
                                            // 加入文件列表
                                            rel.add(new FileInfoBean(
                                                    sub.getName(),
                                                    sub.getPath(),
                                                    sub.isDirectory() ? FusionUnitType.FileType.FLODER
                                                            : FusionUnitType.FileType.FILE));
                                        }
                                        break;
                                    case FILTER_TYPE_NON:
                                    default:
                                        rel.add(new FileInfoBean(sub.getName(), sub
                                                .getPath(),
                                                sub.isDirectory() ? FusionUnitType.FileType.FLODER
                                                        : FusionUnitType.FileType.FILE));
                                        break;
                                }
                            }
                        }
                    }
                }
                // 读取下一层文件
                else {
                    // 是否是文件夹,且存在
                    if (file.exists() && file.isDirectory()) {
                        // 获取文件夹下所有文件
                        File[] files = file.listFiles();
                        if (files != null && files.length > 0) {
                            for (File sub : files) {
                                switch (mFileFilter) {

                                    case FILTER_TYPE_FILE:
                                        // 后缀过滤为空，则全部加在
                                        if (TextUtils.isEmpty(mFileSuffix)) {
                                            rel.add(new FileInfoBean(
                                                    sub.getName(),
                                                    sub.getPath(),
                                                    sub.isDirectory() ? FusionUnitType.FileType.FLODER
                                                            : FusionUnitType.FileType.FILE));
                                        } else {
                                            // 过滤后缀
                                            if (sub.getName()
                                                    .toUpperCase()
                                                    .endsWith(
                                                            mFileSuffix
                                                                    .toUpperCase())) {
                                                rel.add(new FileInfoBean(
                                                        sub.getName(),
                                                        sub.getPath(),
                                                        sub.isDirectory() ? FusionUnitType.FileType.FLODER
                                                                : FusionUnitType.FileType.FILE));
                                            }
                                        }
                                    case FILTER_TYPE_FLODER:
                                        if (sub.isDirectory()) {
                                            // 加入文件列表
                                            rel.add(new FileInfoBean(
                                                    sub.getName(),
                                                    sub.getPath(),
                                                    sub.isDirectory() ? FusionUnitType.FileType.FLODER
                                                            : FusionUnitType.FileType.FILE));
                                        }
                                        break;
                                    case FILTER_TYPE_NON:
                                    default:
                                        rel.add(new FileInfoBean(sub.getName(), sub
                                                .getPath(),
                                                sub.isDirectory() ? FusionUnitType.FileType.FLODER
                                                        : FusionUnitType.FileType.FILE));
                                        break;
                                }
                            }
                        }
                    }
                }
            }
        }
        return rel;
    }

    /**
     * 是否是根目录
     *
     * @param path
     * @return
     * @Title: isRoot
     * @Description: TODO(这里用一句话描述这个方法的作用)
     */
    private boolean isRoot(String path) {
        if (!TextUtils.isEmpty(path) && mSdcardList != null
                && mSdcardList.size() > 0) {
            for (FileInfoBean file : mSdcardList) {
                if (path.equals(file.getFilePath())) {
                    return true;
                }
            }
        }
        return false;
    }

    @Override
    public void onClick(View v) {

        switch (v.getId()) {
            case R.id.back_btn:
                doReturn();
                break;
            case R.id.control_btn:
                saveFileData();
                break;
            default:
                break;
        }
    }

    /**
     * 保存文件
     *
     * @Title: saveFileData
     * @Description: TODO(这里用一句话描述这个方法的作用)
     */
    private void saveFileData() {
        List<String> fileTmp = new ArrayList<String>();
        if (mFileDataList != null && mFileDataList.size() > 0) {
            for (FileInfoBean file : mFileDataList) {
                if (file != null && file.isSelect()) {
                    fileTmp.add(file.getFilePath());
                }
            }
        }
        if (fileTmp.size() > 0) {
            String[] rel = new String[fileTmp.size()];
            Intent intent = new Intent();
            intent.putExtra(INTENT_RESULT_FILE, fileTmp.toArray(rel));
            setResult(RESULT_OK, intent);
            this.finish();
        } else {
            Toast.makeText(this, "请选择文件或文件夹", Toast.LENGTH_SHORT).show();
        }
    }

    /**
     * 返回
     *
     * @Title: doReturn
     * @Description: TODO(这里用一句话描述这个方法的作用)
     */
    private void doReturn() {
        if (!TextUtils.isEmpty(mParentPath)) {
            File fileInfo = new File(mParentPath);
            // 判断上一级就是SDcard
            if (fileInfo != null && isRoot(fileInfo.getPath())) {
                mFileDataList = mSdcardList;
                mParentPath = null;
            } else {
                mParentPath = fileInfo.getParentFile().getPath();
                mFileDataList = getFiles(fileInfo.getPath(), true);
            }

            if (mFileDataList != null && mFileDataList.size() > 0) {
                mFileAdapter.setData(mFileDataList);
                showContent();
            } else {
                showEmpty();
            }
        } else {
            setResult(RESULT_CANCELED);
            this.finish();
        }
    }

    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position,
                            long id) {

        if (mFileDataList != null && mFileDataList.size() > position) {
            FileInfoBean file = mFileDataList.get(position);
            if (file != null && file.getFileType() == FusionUnitType.FileType.FILE) {
                Intent intent = new Intent();
                intent.putExtra(INTENT_RESULT_FILE,
                        new String[]{file.getFilePath()});
                setResult(RESULT_OK, intent);
                this.finish();
            } else {
                mFileDataList = getFiles(file.getFilePath(), false);
                mParentPath = file.getFilePath();
                if (mFileDataList != null && mFileDataList.size() > 0) {
                    mFileAdapter.setData(mFileDataList);
                    showContent();
                } else {
                    showEmpty();
                }
            }
        }
    }

    /**
     * 显示信息
     *
     * @Title: showContent
     * @Description: TODO(这里用一句话描述这个方法的作用)
     */
    private void showContent() {
        mEmptyLayout.setVisibility(View.GONE);
        mFileList.setVisibility(View.VISIBLE);
    }

    /**
     * 显示隐藏
     *
     * @Title: showEmpty
     * @Description: TODO(这里用一句话描述这个方法的作用)
     */
    private void showEmpty() {
        mEmptyLayout.setVisibility(View.VISIBLE);
        mFileList.setVisibility(View.GONE);
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {

        if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
            doReturn();
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }
}
